跳到主要内容

Go 同时计算多个值 Futures 模式

转自 14.9 实现 Futures 模式

所谓 Futures 就是指:有时候在你使用某一个值之前需要先对其进行计算。这种情况下,你就可以在另一个处理器上进行该值的计算,到使用时,该值就已经计算完毕了。

如下,要得到 b_inv 之前先得计算 a_inv

func InverseProduct(a Matrix, b Matrix) {
a_inv := Inverse(a)
b_inv := Inverse(b)
return Product(a_inv, b_inv)
}

有没有办法让它们同时计算呢?这样效率就提升了一倍

依旧是可以使用协程加管道同时计算

func InverseProduct(a Matrix, b Matrix) {
a_inv_future := InverseFuture(a) // start as a goroutine
b_inv_future := InverseFuture(b) // start as a goroutine
a_inv := <-a_inv_future
b_inv := <-b_inv_future
return Product(a_inv, b_inv)
}

这个 InverseFuture 函数以 goroutine 的形式起了一个闭包,该闭包会将矩阵求逆结果放入到 future 通道中:

func InverseFuture(a Matrix) chan Matrix {
future := make(chan Matrix)
go func() {
future <- Inverse(a)
}()
return future
}